今天直接進入主題!
Example Code 延續 [Day 26] 動手篇 - I have a Line Bot,I have a Koa Webhooks (2)
安裝 Request package ( npm install request request-promise --save
)
下述動工的 Code 放進 Webhooks 或自定義的 Webhooks 裡
User 傳得訊息會放在 Webhooks 收到的 Request 裡的 body.events ,內容大致長這裡
{
"events": [
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
// User 傳訊息的型態
"type": "message",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
},
"message": {
"id": "325708",
// 若外層的型態是 message 才會有再細分,詳細一樣可以從上述說明取得
"type": "text",
// User 傳過來的訊息內容
"text": "Hello, world"
}
},
{
"replyToken": "nHuyWiB7yP5Zw52FIkcQobQuGDXCTA",
"type": "follow",
"timestamp": 1462629479859,
"source": {
"type": "user",
"userId": "U206d25c2ea6bd87c17655609a1c37cb8"
}
}
]
}
這裡以 message
當範例,想知道更多可以使用的回覆格式看 這裡
// 使用 Request Promise 發送自定義的訊息
const request = require('request-promise');
// Line Bot 的 Channel Token
const lineBotToken = '...';
// 收到 User Request 時要發回給 User 的訊息放這裡
router.post('/webhooks', function *(ctx, next) {
// User 給 Bot 的訊息是一個 Array
const userMessages = ctx.request.body.events;
// 準備回覆給 User 的訊息
let replyMessages = [];
replyMessages = userMessages.map((currentReplyMessages, userMessage) => {
// 等下放我們要回給 User 的訊息,一次最多 5 則
let messages;
// User 傳來的訊息型態
if ( userMessage.type === 'message' ) {
messages = [
{type: 'text', text: '你成功了!我回你就是了'},
{type: 'image', originalContentUrl: 'http://i.imgur.com/xjTET8v.jpg', previewImageUrl: 'https://sdl-stickershop.line.naver.jp/stickershop/v1/product/1179553/iphone/main@2x.png'},
];
}
else {
messages = [{type: 'text', text: '收到囉!'}];
}
// request 的 options
let options = {
method: 'POST',
uri: 'https://api.line.me/v2/bot/message/reply',
// 客制化 headers 內容,主要告訴 Line 收到的訊息格式和 Line Bot 的 Token
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${lineBotToken}`,
},
body: {
// 告訴 Line 這個訊息回覆給誰
replyToken: userMessage.replyToken,
messages: messages,
},
json: true,
};
return request(options);
});
// 訊息處理好就等待所有 Request 發送出去
yield Promise.all( replyMessages );
})
...
若你和我一樣加回覆功能會再去 Line Bot 確認 Webhooks 是否正確的話,如果 Request 收到的 replyToken 是 00000000000000000000000000000000
和 ffffffffffffffffffffffffffffffff
請略過,因為這兩個 replyToken 是 Line Bot Webhooks 送出來的假 Token ,對這兩個 Token 回覆會導致 Webhooks 收到錯誤而顯示錯誤!
Yeah! Line Bot 會回訊息,接下來相信就是大家發揮自己想法的時候!
好酷喔!!
PHP 可以用官方的 SDK ,步驟比 Node.js 簡化許多,妳也可以打造一個自己的 Line Bot
我這裡有一個簡化官方 PHP SDK 用法的小玩具 https://github.com/weichenlin/LineBusType76
我有同事是用telegram寫寶可夢搜尋機器人XD
有空來玩玩~沒想到line也可以這樣完XD
謝謝Ivan大大^^
暫時捨棄 Telegram ,本來它是首選 :p
[Day 17] 動手篇 - 事前規劃 這篇我有說到選 Line Bot 的原因,其他日後在找時間玩玩 XD